#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main() {
  Mat src = imread("../images/0.jpg");
  if (src.empty()) {
    cout << "could not load image.." << endl;
    return -1;
  }
  namedWindow("opencv setup demo", CV_WINDOW_AUTOSIZE);
  imshow("opencv setup demo", src);

  Mat dst1, dst2;

  char src_title[] = "sourceimage";
  char dst_title1[] = "resultimage1";
  char dst_title2[] = "resultimage2";
  Mat kernel = getStructuringElement(MORPH_RECT, Size(4, 4), Point(-1, -1));
  // 形态学操作
  /**
   * 1.开操作- open:CV_MOP_OPEN  先腐蚀后膨胀/可以去掉小的对象，假设对象是前景色，背景是黑色
   * 2.闭操作-close:CV_MOP_CLOSE  先膨胀后腐蚀/可以填充小的洞（fill hole），假设对象是前景色，背景是黑色
   * 3.形态学梯度- Morphological Gradient:  CV_MOP_GRADIENT  膨胀减去腐蚀/又称为基本梯度（其它还包括-内部梯度、方向梯度
   * 4.顶帽 – top hat: CV_MOP_TOPHAT 顶帽 是原图像与开操作之间的差值图像
   * 5.黑帽-CV_MOP_BLACKHAT：黑帽是闭操作图像与源图像的差值图像
   */
  morphologyEx(src, dst1, CV_MOP_BLACKHAT, kernel);
  imshow(dst_title1, dst1);

  waitKey(0);
  return 0;
}